package com.jeecms.common.office;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
import com.jeecms.common.util.SystemUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * doc docx格式转换
 */
public class DocConverter {
    private static final Logger log = LoggerFactory.getLogger(DocConverter.class);
    private String fileName;
    private File pdfFile;
    private File swfFile;
    private File docFile;

    public DocConverter(String fileString) {
        ini(fileString);
    }

    /**
     * 重新设置file
     *
     * @param fileString '
     */
    public void setFile(String fileString) {
        ini(fileString);
    }

    /**
     * 初始化
     *
     * @param fileString '
     */
    private void ini(String fileString) {
        fileName = fileString.substring(0, fileString.lastIndexOf("."));
        docFile = new File(fileString);
        pdfFile = new File(fileName + ".pdf");
        swfFile = new File(fileName + ".swf");
    }

    /**
     * 转为PDF
     *
     */
    private void doc2pdf() throws Exception {
        if (docFile.exists()) {
            if (!pdfFile.exists()) {
                OpenOfficeConnection connection = new SocketOpenOfficeConnection("127.0.0.1",8100);
                try {
                    connection.connect();
                    DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
                    converter.convert(docFile, pdfFile);
                    // close the connection
                    connection.disconnect();
                    log.info("****pdf转换成功，PDF输出：" + pdfFile.getPath() + "****");
                } catch (java.net.ConnectException e) {
                    e.printStackTrace();
                    log.info("****swf转换器异常，openoffice服务未启动！****");
                    throw e;
                } catch (com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException e) {
                    e.printStackTrace();
                    log.info("****swf转换器异常，读取转换文件失败****");
                    throw e;
                } catch (Exception e) {
                    e.printStackTrace();
                    throw e;
                }
            } else {
                log.info("****Office已经转换为pdf，不需要再进行转化****");
            }
        } else {
            log.info("****swf转换器异常，需要转换的文档不存在，无法转换****");
        }
    }

    /**
     * 转换成 swf
     */
    private void pdf2swf() throws Exception {
        Runtime r = Runtime.getRuntime();
        if (!swfFile.exists()) {
            if (pdfFile.exists()) {
                if (SystemUtil.isWin()) {// windows环境处理
                    try {
                        Process p = r.exec("D:/Program Files/SWFTools/pdf2swf.exe "
                                + pdfFile.getPath() + " -o "
                                + swfFile.getPath() + " -T 9");
                        System.out.print(loadStream(p.getInputStream()));
                        System.err.print(loadStream(p.getErrorStream()));
                        System.out.print(loadStream(p.getInputStream()));
                        log.info("****swf转换成功，文件输出：" + swfFile.getPath() + "****");
                        /*if (pdfFile.exists()) {
                            pdfFile.delete();
                        }*/

                    } catch (IOException e) {
                        e.printStackTrace();
                        throw e;
                    }
                } else {// linux环境处理
                    try {
                        Process p = r.exec("pdf2swf " + pdfFile.getPath()
                                + " -o " + swfFile.getPath() + " -T 9");
                        System.out.print(loadStream(p.getInputStream()));
                        System.err.print(loadStream(p.getErrorStream()));
                        log.info("****swf转换成功，文件输出：" + swfFile.getPath() + "****");
                        /*if (pdfFile.exists()) {
                            pdfFile.delete();
                        }*/
                    } catch (Exception e) {
                        e.printStackTrace();
                        throw e;
                    }
                }
            } else {
                log.info("****pdf不存在,无法转换****");
            }
        } else {
            log.info("****swf已经存在不需要转换****");
        }
    }

    private static String loadStream(InputStream in) throws IOException {

        int ptr = 0;
        in = new BufferedInputStream(in);
        StringBuffer buffer = new StringBuffer();

        while ((ptr = in.read()) != -1) {
            buffer.append((char) ptr);
        }

        return buffer.toString();
    }

    /**
     * 转换主方法
     */
    public boolean conver() {

        if (swfFile.exists()) {
            log.info("****swf转换器开始工作，该文件已经转换为swf****");
            return true;
        }

        if (SystemUtil.isWin()) {
            log.info("****swf转换器开始工作，当前设置运行环境windows****");
        } else {
            log.info("****swf转换器开始工作，当前设置运行环境linux****");
        }
        try {
            doc2pdf();
            pdf2swf();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

        if (swfFile.exists()) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 返回文件路径
     *
     */
    public String getswfPath() {
        if (swfFile.exists()) {
            String tempString = swfFile.getPath();
            tempString = tempString.replaceAll("\\\\", "/");
            return tempString;
        } else {
            return "";
        }

    }

    /**
     * 设置输出路径
     */
    public void setOutputPath(String outputPath) {
        if (!outputPath.equals("")) {
            String realName = fileName.substring(fileName.lastIndexOf("/"),
                    fileName.lastIndexOf("."));
            if (outputPath.charAt(outputPath.length()) == '/') {
                swfFile = new File(outputPath + realName + ".swf");
            } else {
                swfFile = new File(outputPath + realName + ".swf");
            }
        }
    }

    public static void main(String[] args) {
        DocConverter d = new DocConverter("D:/Workspace/jeecmsv9.2-src/target/jeecmsv9f/wenku/www/201801/30004953pk7m.pptx");
        // 调用conver方法开始转换，先执行doc2pdf()将office文件转换为pdf;再执行pdf2swf()将pdf转换为swf;
        d.conver();
    }
}